﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
//
using Persistencia_y_capa_de_negocio;
using System.Net.Mail;

namespace webclonegame.FormulariosPublica
{
    public partial class recuperarclave : System.Web.UI.Page
    {
        /// <summary>
        /// Objeto de tipo ENUsuario para almacenar datos del usuario
        /// </summary>
        protected ENUsuario usuario;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["usu"] != null)
            {
                tbNickname.Text = Request.QueryString["usu"];
                btRecuperar.Focus();
            }
            else
            {
                tbNickname.Focus();
            }
        }

        /// <summary>
        /// Este evento comprueba si los datos de la pagina son validos (el usuario existe) y le envia un
        /// correo electronico de forma automatica con una contraseña generada de forma aleatoria.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btRecuperar_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)//Si los datos son correctos según la validación le enviamos un correo al usario
                //Con su contraseña
            {
                //1 Crear el mensaje
                //1.1 Instanciar el mensaje
                MailMessage mensa = new MailMessage();
                //1.2 Campos de cabecera
                mensa.From = new MailAddress("rtoclonegame@gmail.com", "Roberto Tardío", System.Text.Encoding.UTF8);
                mensa.To.Add(new MailAddress(usuario.EmailUsuario, usuario.NombreUsuario));
                mensa.Subject = "Recuperar contraseña Clonegame";
                mensa.SubjectEncoding = System.Text.Encoding.UTF8;
                //1.3 Especificar el mensaje. Podriamos poner un texto leido de un archivo, como la
                //explicación y tras este la contrseña. 
                //Como no podemos recuperar la contraseña hemos de generarle una nueva.
                //Podemos crearle una nueva por defecto.(o generar una aleatoriamente!!)

                string nuevaclave = GenerarPass();
                //Codificarla
                CodMD5 cod = new CodMD5();
                usuario.PassUsuario = cod.convertiraMD5(nuevaclave);
                //Guardar el usuario con la nueva clave.
                CADUsuario.Instancia.InsertarUsuario(usuario);
                mensa.Body = "Estimado jugador de la aplicación Clonegame:\n\n"
                    + "Tu nombre de usuario es: " + usuario.NombreUsuario + "\n"
                    + "Tu nueva contraseña es: " + nuevaclave + "\n"
                    + "La contraseña ha sido generada de forma aleatoria\n"
                    + "Gracias por usar el servicio de recuperación de \n"
                    + "contraseñas.\n"
                    + "© 2010 by Clonegame software. Todos los derechos reservados.";
                mensa.BodyEncoding = System.Text.Encoding.UTF8;
                mensa.IsBodyHtml = false;
                //2 Enviar el mensaje.
                //2.1 Instanciamos el cliente smtp a usar.
                SmtpClient client = new SmtpClient();
                client.Credentials = new System.Net.NetworkCredential("rtoclonegame@gmail.com", "jugonjugon");
                client.Port = 587;
                client.Host = "smtp.gmail.com";
                client.EnableSsl = true;

                try {
                    client.Send(mensa);
                    //Si el mensaje se envia correctamente
                    Panel1.Visible = false;
                    lbResultado.ForeColor = System.Drawing.Color.White;
                    btContinuar.Visible = true;
                    lbResultado.Text = "El mensaje con la nueva contraseña ha sido enviado a tu cuenta.\n"
                        + "Revisa tu correo electrónico y pulsa en empezar para acceder si lo desesas";
                }
                catch (SmtpException se) {
                    lbResultado.Text = "Error: No se ha podido enviar el mensaje. Código de error: " 
                        + se.StatusCode.ToString();
                }
            }




        }
        
        /// <summary>
        /// Permite generar una contraseña valida de forma aletoria.
        /// </summary>
        /// <returns>La contraseña generada en un string</returns>
        protected string GenerarPass()
        {
            string caracteres = "abcdefghijklmnopqrstuvwxyz";//26 letras
            string numeros = "0123456789";//10 digitos
            string pass = "";
            int letra= 0;//indice de letra a seleccionar
            int numero = 0;//indice de número a seleccionar
            int tam = 0;//tamaño de la clave.
            int tc = 0;//tipo de caracter. 0 sera letra 1 sera número
            int contador = 0;//número de caracteres generados.
            Random gen = new Random();
            tam = gen.Next(4, 11);//Calculamos el tamaño
            //Como minimo tiene que tener una letra, como maximo 10.
            //Como minimo tiene que tener 4 y como maximo 10 caracteres alfanaumeriocos.

            //la primera tiene que ser letra.
            letra = gen.Next(0, 26);
            pass += caracteres[letra];
            contador++;
            //Ahora hacemos un bucle.
            while (contador < tam)
            {
                tc = gen.Next(0, 2);
                if (tc == 0)
                {//Introducimos una letra.
                    letra = gen.Next(0, 26);
                    pass += caracteres[letra];
                }
                else
                {
                    //Introducimos un numero.
                    numero = gen.Next(0, 10);
                    pass += numeros[numero];
                }
                contador++;
            }
            return pass;

        }

        /// <summary>
        /// Valida si el usuario introducido en el tbNickname se corresponde con un usuario de la BD
        /// </summary>
        /// <param name="source"></param>
        /// <param name="args"></param>
        protected void ValidarUsuario_ServerValidate(object source, ServerValidateEventArgs args)
        {
            usuario = CADUsuario.Instancia.BuscarUsuarioPorCuenta(tbNickname.Text.ToString());
            if (tbNickname.Text == string.Empty)
            {
                args.IsValid = false;
                ValidarUsuario.ErrorMessage = "El nombre de usuario es obligatorio.";
            }
            else
            {
                if (usuario == null)
                {
                    //Si el usuario existe no se valida la página
                    args.IsValid = false;
                    ValidarUsuario.ErrorMessage = "Error: El usuario introducido no existe.";
                }
            }
        }

        /// <summary>
        /// Accion que tiene luegar en el boton btContinuar, nos lleva de nuevo a la página empezar.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btContinuar_Click(object sender, EventArgs e)
        {
            Response.Redirect("./empezar.aspx");
        }

    }
}
